home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Trading on the Edge
/
Trading On The Edge - CD-ROM Toolkit (Wayzata Technology)(2031)(1994).bin
/
pc
/
mac_file
/
vendor_d
/
neuralwa
/
nw2v50
/
uio_reqs.c
< prev
next >
Wrap
Text File
|
1993-08-23
|
41KB
|
1,377 lines
/* uio_reqs.c */
/************************************************************************
* Copyright(C) 1987-1992 NeuralWare Inc *
* Penn Center West, IV-227, Pittsburgh, PA 15276 *
* Telephone: (412) 787-8222 FAX: (412) 787-8220 *
* *
* All rights reserved. No part of this program may be reproduced, *
* stored in a retrieval system, or transmitted, in any form or by any *
* means, electronic, mechanical, photocopying, recording or otherwise *
* without the prior written permission of the copyright owner, *
* NeuralWare, Inc. *
* *
* PROPRIETARY NOTICE *
* *
* This document is the property of NeuralWare, Inc. and contains *
* trade-secrets and other proprietary information. The information *
* herein is reserved as proprietary to NeuralWare, and is not to be *
* published, reproduced, copied, disclosed, used, or reverse *
* engineered without the express written consent of a duly authorized *
* representative of NeuralWare. *
************************************************************************
*/
/*************************************************************/
/* */
/* uio_reqs.c - User IO requests to NeuralWorks */
/* Author: John C. Fairman August 31, 1990 */
/* Copyright 1990 by NeuralWare Inc. */
/* */
/* $Author : $ */
/* $Date : $ */
/* $Source : $ */
/* $Revision : $ */
/* $Log : $ */
/* */
/*************************************************************/
#include "host.h"
#if defined(SUN)
#include <sys/types.h>
#endif
#ifdef MPW3
#include <StdDef.h>
#endif
#define UIO_SERVER 1
#define SKIP_COMPAT_DATA 1
#define HOME_FOR_UIO_DATA 1
#include "userutl.h"
#include "uio_strc.h"
#include "uio_tran.h"
#include <string.h>
#if defined(_MSC_VER) || defined(__TURBOC__)
EXPORT VOID Send_request( VOID );
LOCAL VOID send_request_with_id( VOID );
#endif
#ifdef THINK_C
#include "macuio.redef"
#endif
#ifdef DLC
/* --- prototypes --- */
/* InitGMenu( GMENU *, int, int ); */ /* Initialize a menu */
/* DispGMenu( GMENU * ); */ /* Display graphics menu */
/* DispGItem( GMENU *, GMENU_ITEM *, int, int ); */ /* Display menu item */
/* GMENU_ITEM *LookGMenu( GMENU *, int * ); */ /* Look at graphics menu */
#else
GMENU_ITEM *LookGMenu();
#endif
#if defined(MSDOS)
#include <string.h>
#endif
#define INALC 20
/* FUNCTION */
LOCAL VOID send_request_with_id()
{
Data_transfer_ptr->RPC_area.process_from_id = (BUFFER_INT)Process_id;
Data_transfer_ptr->RPC_area.process_to_id = (BUFFER_INT)HOST_PROCESS_ID;
Send_request();
if ((Data_transfer_ptr->RPC_area.request >= 0x80) && /* ERROR */
(Data_transfer_ptr->RPC_area.request < 0xC0))
{
UIO_error_value = Data_transfer_ptr->RPC_area.request;
}
}
/* FUNCTION */
EXPORT TEXT *GetStr()
{
RPC_AREA_T *rpc;
static TEXT ag_msg[MAX_UIO_STRING];
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_GETSTR;
send_request_with_id();
strcpy(ag_msg, rpc->all_arg_lists.argmsg.ag_msg);
return(ag_msg);
}
/* FUNCTION */
EXPORT VOID PutStr( sp )
TEXT *sp;
{
RPC_AREA_T *rpc;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_PUTSTR;
strcpy(rpc->all_arg_lists.argmsg.ag_msg, sp);
send_request_with_id();
}
/**/
/* FUNCTION */
EXPORT VOID PutFmt(fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9)
TEXT *fmt;
UL a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9;
{
RPC_AREA_T *rpc;
ARGFMT *argfmt;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_PUTFMT;
argfmt = &rpc->all_arg_lists.argfmt;
#if (PIGS_EVER_FLY)
strcpy(argfmt->format, fmt);
argfmt->format_args[ 0] = a0;
argfmt->format_args[ 1] = a1;
argfmt->format_args[ 2] = a2;
argfmt->format_args[ 3] = a3;
argfmt->format_args[ 4] = a4;
argfmt->format_args[ 5] = a5;
argfmt->format_args[ 6] = a6;
argfmt->format_args[ 7] = a7;
argfmt->format_args[ 8] = a8;
argfmt->format_args[ 9] = a9;
argfmt->format_args[10] = b0;
argfmt->format_args[11] = b1;
argfmt->format_args[12] = b2;
argfmt->format_args[13] = b3;
argfmt->format_args[14] = b4;
argfmt->format_args[15] = b5;
argfmt->format_args[16] = b6;
argfmt->format_args[17] = b7;
argfmt->format_args[18] = b8;
argfmt->format_args[19] = b9;
#else
/* CCK: 12-Apr-91 This is the one that works!! */
sprintf(argfmt->format, fmt,
a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9);
#endif
send_request_with_id();
}
/* FUNCTION */
EXPORT NINT SaveNet( NetName, Mode )
TEXT *NetName;
NINT Mode; /* 0=binary, 1=ascii, 2=annotated, 3=screen dump */
{
RPC_AREA_T *rpc;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_SAVENET;
strcpy(rpc->all_arg_lists.argn.ag_NetN, NetName);
rpc->all_arg_lists.argn.ag_mode = (BUFFER_UINT)Mode;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/**/
/*****************************************************************************/
/* */
/* Graphic Routine interfaces for NWORKS */
/* */
/*****************************************************************************/
/* FUNCTION */
EXPORT VOID ug_window( key, bkcolor, x0, y0, x1, y1 )
NINT key; /* window number for a handle (1..8) */
NINT bkcolor; /* background color */
NINT x0, y0; /* screen coordinates of origin (bottom left corner) */
NINT x1, y1; /* screen coordinates of top right corner */
{
RPC_AREA_T *rpc;
ARG1 *arg1;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_WINDOW;
arg1 = &rpc->all_arg_lists.arg1;
arg1->ag_winn = (BUFFER_UINT)key;
arg1->ag_color = (BUFFER_UINT)bkcolor;
arg1->ag_x0 = (BUFFER_UINT)x0;
arg1->ag_y0 = (BUFFER_UINT)y0;
arg1->ag_x1 = (BUFFER_UINT)x1;
arg1->ag_y1 = (BUFFER_UINT)y1;
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_line( key, color, mode, x0, y0, x1, y1, style )
NINT key; /* window number for a handle (1..8) */
NINT color; /* color index */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for origin */
NINT x1, y1; /* window relative coordinates for end */
NINT style; /* line style */
{
RPC_AREA_T *rpc;
ARG2 *arg2;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_LINE;
arg2 = &rpc->all_arg_lists.arg2;
arg2->ag_winn = (BUFFER_UINT)key;
arg2->ag_color = (BUFFER_UINT)color;
arg2->ag_mode = (BUFFER_UINT)mode;
arg2->ag_x0 = (BUFFER_UINT)x0;
arg2->ag_y0 = (BUFFER_UINT)y0;
arg2->ag_x1 = (BUFFER_UINT)x1;
arg2->ag_y1 = (BUFFER_UINT)y1;
arg2->ag_style = (BUFFER_UINT)style;
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_circle( key, color, mode, x0, y0, rad, fill )
NINT key; /* window number for a handle (1..8) */
NINT color; /* color index */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for origin */
NINT rad; /* radius */
NINT fill; /* fill flag */
{
RPC_AREA_T *rpc;
ARG2 *arg2;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_CIRCLE;
arg2 = &rpc->all_arg_lists.arg2;
arg2->ag_winn = (BUFFER_UINT)key;
arg2->ag_color = (BUFFER_UINT)color;
arg2->ag_mode = (BUFFER_UINT)mode;
arg2->ag_x0 = (BUFFER_UINT)x0;
arg2->ag_y0 = (BUFFER_UINT)y0;
arg2->ag_x1 = (BUFFER_UINT)rad;
arg2->ag_style = (BUFFER_UINT)fill;
send_request_with_id();
}
/**/
/* FUNCTION */
EXPORT VOID ug_point( key, color, mode, x0, y0 )
NINT key; /* window number for a handle (1..8) */
NINT color; /* color index */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for point */
{
RPC_AREA_T *rpc;
ARG2 *arg2;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_POINT;
arg2 = &rpc->all_arg_lists.arg2;
arg2->ag_winn = (BUFFER_UINT)key;
arg2->ag_color = (BUFFER_UINT)color;
arg2->ag_mode = (BUFFER_UINT)mode;
arg2->ag_x0 = (BUFFER_UINT)x0;
arg2->ag_y0 = (BUFFER_UINT)y0;
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_box( key, color, mode, x0, y0, x1, y1, style )
NINT key; /* window number for a handle (1..8) */
NINT color; /* color index */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for lower left corner */
NINT x1, y1; /* window relative coordinates for upper right corner */
NINT style; /* line style */
{
RPC_AREA_T *rpc;
ARG2 *arg2;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_BOX;
arg2 = &rpc->all_arg_lists.arg2;
arg2->ag_winn = (BUFFER_UINT)key;
arg2->ag_color = (BUFFER_UINT)color;
arg2->ag_mode = (BUFFER_UINT)mode;
arg2->ag_x0 = (BUFFER_UINT)x0;
arg2->ag_y0 = (BUFFER_UINT)y0;
arg2->ag_x1 = (BUFFER_UINT)x1;
arg2->ag_y1 = (BUFFER_UINT)y1;
arg2->ag_style = (BUFFER_UINT)style;
send_request_with_id();
}
/**/
/* FUNCTION */
EXPORT VOID ug_boxf( key, color, mode, x0, y0, x1, y1 )
NINT key; /* window number for a handle (1..8) */
NINT color; /* color index */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for lower left corner */
NINT x1, y1; /* window relative coordinates for upper right corner */
{
RPC_AREA_T *rpc;
ARG2 *arg2;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_BOXF;
arg2 = &rpc->all_arg_lists.arg2;
arg2->ag_winn = (BUFFER_UINT)key;
arg2->ag_color = (BUFFER_UINT)color;
arg2->ag_mode = (BUFFER_UINT)mode;
arg2->ag_x0 = (BUFFER_UINT)x0;
arg2->ag_y0 = (BUFFER_UINT)y0;
arg2->ag_x1 = (BUFFER_UINT)x1;
arg2->ag_y1 = (BUFFER_UINT)y1;
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_puts( key, color, mode, x0, y0, sp, rot )
NINT key; /* window number for a handle (1..8) */
NINT color; /* color index */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for lower left corner */
TEXT *sp; /* string to draw */
NINT rot; /* rotation angle */
{
RPC_AREA_T *rpc;
ARG4 *arg4;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_PUTS;
arg4 = &rpc->all_arg_lists.arg4;
arg4->ag_winn = (BUFFER_UINT)key;
arg4->ag_color = (BUFFER_UINT)color;
arg4->ag_mode = (BUFFER_UINT)mode;
arg4->ag_x0 = (BUFFER_UINT)x0;
arg4->ag_y0 =(BUFFER_UINT) y0;
strcpy((TEXT *)arg4->ag_sp, sp);
arg4->ag_rot = (BUFFER_UINT)rot;
send_request_with_id();
}
/**/
/* FUNCTION */
EXPORT VOID ug_windel( key )
NINT key; /* window number to delete; 0=delete all windows */
{
RPC_AREA_T *rpc;
ARG3 *arg3;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_WINDEL;
arg3 = &rpc->all_arg_lists.arg3;
arg3->ag_winn = (BUFFER_UINT)key;
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_winclr( key )
NINT key; /* clear the contents of this window */
{
RPC_AREA_T *rpc;
ARG3 *arg3;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_WINCLR;
arg3 = &rpc->all_arg_lists.arg3;
arg3->ag_winn = (BUFFER_UINT)key;
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_gparms( xsizep, ysizep, ncolorp, chrxp, chryp )
NINT *xsizep; /* width of user area in x-pixels */
NINT *ysizep; /* height of user area in y-pixels */
NINT *ncolorp; /* # of colors (including background) */
NINT *chrxp; /* # of x-pixels in a Character */
NINT *chryp; /* # of y-pixels in a Character */
{
RPC_AREA_T *rpc;
AGPARMS *agparms;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_GPARMS;
agparms = &rpc->all_arg_lists.agparms;
send_request_with_id();
if (UIO_error_value == 0)
{
*xsizep = (NINT)agparms->xsize;
*ysizep = (NINT)agparms->ysize;
*ncolorp = (NINT)agparms->ncolor;
*chrxp = (NINT)agparms->chrx;
*chryp = (NINT)agparms->chry;
}
}
/**/
/* FUNCTION */
EXPORT VOID ug_mouse( keyp, xp, yp, mp )
NINT *keyp; /* poNINTer to window number mouse is in */
NINT *xp; /* pointer to relative x-coordinate */
NINT *yp; /* pointer to relative y-coordinate */
NINT *mp; /* button press codes */
{
RPC_AREA_T *rpc;
AMOUSE *amouse;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_MOUSE;
amouse = &rpc->all_arg_lists.amouse;
send_request_with_id();
if (UIO_error_value == 0)
{
*keyp = (NINT)amouse->key;
*xp = (NINT)amouse->xloc;
*yp = (NINT)amouse->yloc;
*mp = (NINT)amouse->buttonstates;
}
}
/* FUNCTION */
EXPORT NINT ug_rdpoint( key, x0, y0 )
NINT key; /* window number for a handle (1..8) */
NINT x0, y0; /* window relative coordinates for lower left corner */
{
RPC_AREA_T *rpc;
ARG3 *arg3;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_RDPOINT;
arg3 = &rpc->all_arg_lists.arg3;
arg3->ag_winn = (BUFFER_UINT)key;
arg3->ag_x0 = (BUFFER_UINT)x0;
arg3->ag_y0 = (BUFFER_UINT)y0;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT VOID ug_rdnetinf( nlayp, ninp, noutp, ltypep, cspp, netnpp )
NINT *nlayp; /* return pointer to number of layers will be */
NINT *ninp; /* return pointer to number of inputs */
NINT *noutp; /* return pointer to number of outputs */
NINT *ltypep; /* return pointer to layer type (0=hetero; 1=auto) */
TEXT **cspp; /* return pointer to control strategy name */
TEXT **netnpp; /* return pointer to network file name */
{
RPC_AREA_T *rpc;
ARDNETINF *ardnetinf;
static TEXT cs[FNALC] = {0};
static TEXT netn[FNALC]= {0};
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_RDNETINF;
ardnetinf = &rpc->all_arg_lists.ardnetinf;
send_request_with_id();
if (UIO_error_value == 0)
{
*nlayp = (NINT)ardnetinf->nlay;
*ninp = (NINT)ardnetinf->nin;
*noutp = (NINT)ardnetinf->nout;
*ltypep = (NINT)ardnetinf->ltype;
if (ardnetinf->cs[0] == '\0')
{
*cspp = *netnpp = NULL;
}
else
{
strcpy(cs, (TEXT *)ardnetinf->cs);
strcpy(netn, (TEXT *)ardnetinf->netn);
*cspp = cs;
*netnpp = netn;
}
}
}
/* FUNCTION */
EXPORT TEXT *ug_getinstrt()
{
RPC_AREA_T *rpc;
static TEXT ag_msg[INALC];
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_GETINSTRT;
send_request_with_id();
strcpy(ag_msg, (TEXT *)rpc->all_arg_lists.argmsg.ag_msg);
return(ag_msg);
}
/* FUNCTION */
EXPORT NINT ug_loadnet( NetName )
TEXT *NetName; /* root name of network to load */
{
RPC_AREA_T *rpc;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_LOADNET;
strcpy(rpc->all_arg_lists.argn.ag_NetN, NetName);
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT NINT ug_learn( trials )
TRIAL_NUM_T trials;
{
RPC_AREA_T *rpc;
ARGLR *arglr;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_LEARN;
arglr = &rpc->all_arg_lists.arglr;
arglr->ag_count = (BUFFER_LONG)trials;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_recall( trials )
TRIAL_NUM_T trials;
{
RPC_AREA_T *rpc;
ARGLR *arglr;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_RECALL;
arglr = &rpc->all_arg_lists.arglr;
arglr->ag_count = (BUFFER_LONG)trials;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_test( trials )
TRIAL_NUM_T trials;
{
RPC_AREA_T *rpc;
ARGLR *arglr;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_TEST;
arglr = &rpc->all_arg_lists.arglr;
arglr->ag_count = (BUFFER_LONG)trials;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_savebest(svb_lcnt, svb_tint, svb_nret, svb_logf, svb_fn,
svb_prfl, svb_prmx, svb_prtol)
SL svb_lcnt; /* learn count */
SL svb_tint; /* test interval */
SL svb_nret; /* number of retries before halting */
NINT svb_logf; /* Log flag */
TEXT *svb_fn; /* File name to save to */
NINT svb_prfl; /* Prune flag */
NINT svb_prmx; /* Max # units to prune */
REAL svb_prtol; /* tolerance */
{
RPC_AREA_T *rpc;
ASAVEBEST *asavebest;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_SAVEBEST;
asavebest = &rpc->all_arg_lists.asavebest;
if (svb_fn != (TEXT *)0) {
strncpy(rpc->all_arg_lists.asavebest.svb_fn, svb_fn, FNLEN);
rpc->all_arg_lists.asavebest.svb_fn[FNALC-1] = '\0';
}
else
rpc->all_arg_lists.asavebest.svb_fn[0] = '\0';
asavebest->svb_lcnt = svb_lcnt;
asavebest->svb_tint = svb_tint ;
asavebest->svb_nret = svb_nret;
asavebest->svb_logf = svb_logf;
asavebest->svb_prfl = svb_prfl;
asavebest->svb_prmx = svb_prmx;
asavebest->svb_prtol = svb_prtol;
send_request_with_id();
return((NINT) rpc->return_value.buffer_int);
}
EXPORT NINT ug_cclrn(max_nd, n_cand, v_max, ret_f,
stb_maxepoch, stb_patience, stb_rmsetol)
NINT max_nd; /* Max nodes to try out */
NINT n_cand; /* Number of candidates */
NINT v_max; /* Maximum dimension of vector candidate */
NINT ret_f; /* =1: Retrain tenured PEs */
NINT stb_maxepoch; /* Stability criterion - Maximum # epochs */
NINT stb_patience; /* Stability criterion - Patience */
REAL stb_rmsetol; /* Stability criterion - RMS error tolerance */
{
RPC_AREA_T *rpc;
ACCLRN *acclrn;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_CCLRN;
acclrn = &rpc->all_arg_lists.acclrn;
acclrn->max_nd = max_nd;
acclrn->n_cand = n_cand;
acclrn->v_max = v_max;
acclrn->ret_f = ret_f;
acclrn->stb_maxepoch = stb_maxepoch;
acclrn->stb_patience = stb_patience;
acclrn->stb_rmsetol = stb_rmsetol;
send_request_with_id();
return((NINT) rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_msgio( msg, msgl, rwf )
TEXT *msg; /* message to send / read */
NINT msgl; /* message length */
NINT rwf; /* 0=read; 1=write */
{
RPC_AREA_T *rpc;
ARGMSG *argmsg;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_MSGIO;
argmsg = &rpc->all_arg_lists.argmsg;
argmsg->ag_msgl = msgl;
argmsg->ag_msgdir = (BUFFER_UINT)rwf;
if (rwf)
strcpy(argmsg->ag_msg, msg);
send_request_with_id();
if (UIO_error_value == 0)
{
if (!rwf)
strcpy(msg, argmsg->ag_msg);
}
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT VOID ug_wtstats( PStat )
PRSTATS *PStat; /* statistics */
{
RPC_AREA_T *rpc;
PRSTATS_BUF *prstats_buf;
NINT lcv;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_WTSTATS;
send_request_with_id();
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(PStat, prstats_buf, sizeof(PRSTATS_BUF));
#else
prstats_buf = &rpc->all_arg_lists.prstats_buf;
PStat->PRNwts = prstats_buf->PRNwts;
PStat->PRMin = prstats_buf->PRMin;
PStat->PRMax = prstats_buf->PRMax;
PStat->PRSum = prstats_buf->PRSum;
PStat->PRAverage = prstats_buf->PRAverage;
PStat->PRMedian = prstats_buf->PRMedian;
for (lcv=0; lcv<NPHIST; lcv++)
PStat->PRHist[lcv] = prstats_buf->PRHist[lcv];
PStat->PRMinA = prstats_buf->PRMinA;
PStat->PRMaxA = prstats_buf->PRMaxA;
PStat->PRSumA = prstats_buf->PRSumA;
PStat->PRAverageA = prstats_buf->PRAverageA;
PStat->PRMedianA = prstats_buf->PRMedianA;
for (lcv=0; lcv<NPHIST; lcv++)
PStat->PRHistA[lcv] = prstats_buf->PRHistA[lcv];
#endif
}
/* FUNCTION */
EXPORT VOID ug_prune( mode, PrThresh, Prob, WtMax )
NINT mode; /* prune mode */
REAL PrThresh; /* pruning threshold */
REAL Prob; /* stochastic probability */
REAL WtMax; /* maximum magnitude to limit wts to */
{
RPC_AREA_T *rpc;
ARGPRUNE *argprune;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_PRUNE;
argprune = &rpc->all_arg_lists.argprune;
argprune->pr_mode = (BUFFER_UINT)mode;
argprune->pr_thresh = (BUFFER_REAL)PrThresh;
argprune->pr_prob = (BUFFER_REAL)Prob;
argprune->pr_wtmax = (BUFFER_REAL)WtMax;
send_request_with_id();
}
/**/
/* FUNCTION */
EXPORT VOID ug_blit(key, mode, x0, y0, x_exp, y_exp, x_size, y_size, data)
NINT key; /* window number for a handle (1..8) */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for lower left corner */
NINT x_exp, y_exp; /* How many pixels to expand each bit in the x and */
/* y direction */
NINT x_size,y_size; /* the size of the mask in the x and y direction */
TEXT *data; /* the data to be blitted. one byte per char and */
/* the value of that byte determines the color put */
/* on the screen. The bytes start at bottom right */
/* and then fill the first row, then next row up */
/* to top. */
{
RPC_AREA_T *rpc;
ARGBLIT *argblit;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_BLIT;
argblit = &rpc->all_arg_lists.argblit;
argblit->ag_winn = (BUFFER_UINT)key;
argblit->ag_mode = (BUFFER_UINT)mode;
argblit->ag_x0 = (BUFFER_UINT)x0;
argblit->ag_y0 = (BUFFER_UINT)y0;
argblit->ag_x_exp = (BUFFER_UINT)x_exp;
argblit->ag_y_exp = (BUFFER_UINT)y_exp;
argblit->ag_x_size = (BUFFER_UINT)x_size;
argblit->ag_y_size = (BUFFER_UINT)y_size;
MOVEMEM(argblit->ag_blit_bytes, data, x_size*y_size);
send_request_with_id();
}
/* FUNCTION */
EXPORT VOID ug_pblit( key, color, mode, x0, y0, wid, ht, rot, ptr )
NINT key; /* window handle */
NINT color; /* color of pattern */
NINT mode; /* 0=set, 1=xor */
NINT x0, y0; /* window relative coordinates for lower left corner */
NINT wid, ht; /* width & height of blit area in pixels */
NINT rot; /* rotation angle */
TEXT *ptr; /* pointer to the blit data */
{
RPC_AREA_T *rpc;
ARGPBLIT *argpblit;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_PBLIT;
argpblit = &rpc->all_arg_lists.argpblit;
argpblit->ag_winn = (BUFFER_UINT)key;
argpblit->ag_color = (BUFFER_UINT)color;
argpblit->ag_mode = (BUFFER_UINT)mode;
argpblit->ag_x0 = (BUFFER_UINT)x0;
argpblit->ag_y0 = (BUFFER_UINT)y0;
argpblit->ag_x_size = (BUFFER_UINT)wid;
argpblit->ag_y_size = (BUFFER_UINT)ht;
argpblit->ag_rot = rot;
MOVEMEM(argpblit->ag_blit_bytes, ptr, wid*ht);
send_request_with_id();
}
/**/
/* FUNCTION */
EXPORT NINT ug_peio( apep, rwf, LayN, PEN )
APE *apep; /* poiner to PE data */
NINT rwf; /* 0=read; 1=write */
NINT LayN; /* layer number 0=input,... */
NINT PEN; /* PE within layer 0=first, ... */
{
RPC_AREA_T *rpc;
ARGPSCIO *argpscio;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_PEIO;
argpscio = &rpc->all_arg_lists.argpscio;
argpscio->ag_rwf = (BUFFER_UINT)rwf;
argpscio->ag_layern = LayN;
argpscio->ag_pen = PEN;
if (rwf)
{
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(&argpscio->ag_rdata.ag_pe, apep, sizeof(APE));
#else
argpscio->ag_rdata.ag_pe.ape_I = apep->ape_I;
argpscio->ag_rdata.ag_pe.ape_Tran = apep->ape_Tran;
argpscio->ag_rdata.ag_pe.ape_Output = apep->ape_Output;
argpscio->ag_rdata.ag_pe.ape_Err = apep->ape_Err;
argpscio->ag_rdata.ag_pe.ape_CumErr = apep->ape_CumErr;
argpscio->ag_rdata.ag_pe.ape_Flags = apep->ape_Flags;
#endif
}
send_request_with_id();
if (!rwf)
{
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(apep, &argpscio->ag_rdata.ag_pe, sizeof(APE));
#else
apep->ape_I = argpscio->ag_rdata.ag_pe.ape_I;
apep->ape_Tran = argpscio->ag_rdata.ag_pe.ape_Tran;
apep->ape_Output = argpscio->ag_rdata.ag_pe.ape_Output;
apep->ape_Err = argpscio->ag_rdata.ag_pe.ape_Err;
apep->ape_CumErr = argpscio->ag_rdata.ag_pe.ape_CumErr;
apep->ape_Flags = argpscio->ag_rdata.ag_pe.ape_Flags;
#endif
}
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT NINT ug_schdio( schp, rwf, LayN )
ASCHED *schp; /* pointer to schedule date */
NINT rwf; /* 0=read; 1=write */
NINT LayN; /* layer number 0=input, ... */
{
RPC_AREA_T *rpc;
ARGPSCIO *argpscio;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_SCHDIO;
argpscio = &rpc->all_arg_lists.argpscio;
argpscio->ag_rwf = (BUFFER_UINT)rwf;
argpscio->ag_layern = LayN;
if (rwf)
{
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(&argpscio->ag_rdata.ag_sched, schp, sizeof(ASCHED));
#else
int lcv1, lcv2;
strcpy(argpscio->ag_rdata.ag_sched.asc_nam, schp->asc_nam);
for (lcv1=0; lcv1<5; lcv1++) {
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_recall =
schp->asc_col[lcv1].asc_recall;
for (lcv2=0; lcv2<10; lcv2++) {
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_rcl[lcv2] =
schp->asc_col[lcv1].asc_rcl[lcv2];
}
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_learn =
schp->asc_col[lcv1].asc_learn;
for (lcv2=0; lcv2<10; lcv2++) {
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_lrn[lcv2] =
schp->asc_col[lcv1].asc_lrn[lcv2];
}
}
#endif
}
send_request_with_id();
/**/
if (UIO_error_value == 0)
{
if (!rwf) {
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(schp, &argpscio->ag_rdata.ag_sched, sizeof(ASCHED));
#else
int lcv1, lcv2;
strcpy(schp->asc_nam, argpscio->ag_rdata.ag_sched.asc_nam);
for (lcv1=0; lcv1<5; lcv1++) {
schp->asc_col[lcv1].asc_recall =
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_recall;
for (lcv2=0; lcv2<10; lcv2++) {
schp->asc_col[lcv1].asc_rcl[lcv2] =
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_rcl[lcv2];
}
schp->asc_col[lcv1].asc_learn =
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_learn;
for (lcv2=0; lcv2<10; lcv2++) {
schp->asc_col[lcv1].asc_lrn[lcv2] =
argpscio->ag_rdata.ag_sched.asc_col[lcv1].asc_lrn[lcv2];
}
}
#endif
}
}
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT NINT ug_ctrio( ctrp, rwf)
CTRIO_T *ctrp; /* pointer to array of 8-LONGs */
NINT rwf; /* 0=read; 1=write */
{
RPC_AREA_T *rpc;
ARGPSCIO *argpscio;
NINT lcv;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_CTRIO;
argpscio = &rpc->all_arg_lists.argpscio;
argpscio->ag_rwf = (BUFFER_UINT)rwf;
if (rwf)
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(argpscio->ag_rdata.ag_ctr, ctrp, sizeof(CTRIO_T) * 8);
#else
for (lcv=0; lcv<8; lcv++)
argpscio->ag_rdata.ag_ctr[lcv] = (BUFFER_LONG)ctrp[lcv];
#endif
send_request_with_id();
if (UIO_error_value == 0)
{
if (!rwf)
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(ctrp, argpscio->ag_rdata.ag_ctr, sizeof(CTRIO_T) * 8);
#else
for (lcv=0; lcv<8; lcv++)
ctrp[lcv] = (SL)argpscio->ag_rdata.ag_ctr[lcv];
#endif
}
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT NINT ug_lyrio( lyrp, rwf, LayN )
ALYR *lyrp; /* pointer to layer info structure */
NINT rwf; /* 0=read; 1=write */
NINT LayN; /* layer number 0=input, ... */
{
RPC_AREA_T *rpc;
ARGPSCIO *argpscio;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_LYRIO;
argpscio = &rpc->all_arg_lists.argpscio;
argpscio->ag_rwf = (BUFFER_UINT)rwf;
argpscio->ag_layern = LayN;
if (rwf) {
argpscio->ag_rdata.ag_lyr.scale = lyrp->scale;
argpscio->ag_rdata.ag_lyr.offst = lyrp->offst;
argpscio->ag_rdata.ag_lyr.fprm_offst = lyrp->fprm_offst;
argpscio->ag_rdata.ag_lyr.low_init = lyrp->low_init;
argpscio->ag_rdata.ag_lyr.high_init = lyrp->high_init;
}
send_request_with_id();
if (!rwf) {
lyrp->num_pes = argpscio->ag_rdata.ag_lyr.num_pes;
lyrp->n_wt_flds = argpscio->ag_rdata.ag_lyr.n_wt_flds;
lyrp->sum_f = argpscio->ag_rdata.ag_lyr.sum_f;
lyrp->tran_f = argpscio->ag_rdata.ag_lyr.tran_f;
lyrp->output_f = argpscio->ag_rdata.ag_lyr.output_f;
lyrp->learn_f = argpscio->ag_rdata.ag_lyr.learn_f;
lyrp->error_f = argpscio->ag_rdata.ag_lyr.error_f;
lyrp->noise_f = argpscio->ag_rdata.ag_lyr.noise_f;
lyrp->scale = argpscio->ag_rdata.ag_lyr.scale;
lyrp->offst = argpscio->ag_rdata.ag_lyr.offst;
lyrp->fprm_offst = argpscio->ag_rdata.ag_lyr.fprm_offst;
lyrp->low_init = argpscio->ag_rdata.ag_lyr.low_init;
lyrp->high_init = argpscio->ag_rdata.ag_lyr.high_init;
}
return((NINT)rpc->return_value.buffer_int);
}
/**/
/* FUNCTION */
EXPORT NINT ug_ioparms(ioparms, rwf)
IOPARMS *ioparms;
NINT rwf; /* 0=read; 1=write */
{
RPC_AREA_T *rpc;
IOPARMS_BUF *ioparms_buf;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_IOPARMS;
rpc->all_arg_lists.argpscio.ag_rwf = (BUFFER_UINT)rwf;
ioparms_buf = &rpc->all_arg_lists.argpscio.ag_rdata.ioparms_buf;
if (rwf)
{
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(ioparms_buf, ioparms, sizeof(IOPARMS));
#else
ioparms_buf->start_in = ioparms->start_in;
ioparms_buf->min_in = ioparms->min_in;
ioparms_buf->max_in = ioparms->max_in;
ioparms_buf->start_out = ioparms->start_out;
ioparms_buf->min_out = ioparms->min_out;
ioparms_buf->max_out = ioparms->max_out;
#endif
}
send_request_with_id();
if (UIO_error_value == 0)
{
if (!rwf)
{
#if (SERVPRIMS_EQ_BUFFERPRIMS)
MOVEMEM(ioparms, ioparms_buf, sizeof(IOPARMS));
#else
ioparms->start_in = ioparms_buf->start_in;
ioparms->min_in = ioparms_buf->min_in;
ioparms->max_in = ioparms_buf->max_in;
ioparms->start_out = ioparms_buf->start_out;
ioparms->min_out = ioparms_buf->min_out;
ioparms->max_out = ioparms_buf->max_out;
#endif
}
}
}
/**/
/* FUNCTION */
EXPORT NINT ug_cnio(LayN, PEN, SLayN, SPEN, n_cn_vals,var_idx, rwf, cn_vals)
NINT LayN; /* layer number 0=input,... */
NINT PEN; /* PE within layer 0=first, ... */
NINT SLayN; /* source layer number 0=input,... */
NINT SPEN; /* start PE within source layer 0=first, ... */
NINT *n_cn_vals; /* Number of values to write/get. 0 = all */
NINT var_idx; /* Identifier of variable within connection */
NINT rwf; /* 0=read; 1=write */
SREAL *cn_vals; /* values */
{
RPC_AREA_T *rpc;
ARGCNIO *argcnio;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_CNIO;
argcnio = &rpc->all_arg_lists.argcnio;
argcnio->layern = LayN;
argcnio->pen = PEN;
argcnio->slayern = SLayN;
argcnio->spen = SPEN;
argcnio->var_idx = var_idx;
argcnio->rwf = (BUFFER_UINT)rwf;
if (rwf) {
if (*n_cn_vals > MAX_CN_VALS)
*n_cn_vals = MAX_CN_VALS;
else if (*n_cn_vals <=0)
*n_cn_vals = 1;
argcnio->n_cn_vals = *n_cn_vals;
MOVEMEM(argcnio->cn_vals, cn_vals,
argcnio->n_cn_vals*sizeof(BUFFER_REAL));
} else
argcnio->n_cn_vals = *n_cn_vals;
send_request_with_id();
*n_cn_vals = argcnio->n_cn_vals;
if (!rwf) {
/* Note: (!rwf && *n_cn_vals==0) => give me as many
vals as possible */
MOVEMEM(cn_vals, argcnio->cn_vals,
argcnio->n_cn_vals*sizeof(BUFFER_REAL));
}
return((NINT) rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_fileio(fn, lrf, binf, rndf, ldf)
TEXT *fn; /* File name (root only) */
NINT lrf; /* Learn = 0, Recall/Test = 1 */
NINT binf; /* Binary flag */
NINT rndf; /* Randomization flag */
NINT ldf; /* Load flag */
{
RPC_AREA_T *rpc;
ARGFILEIO *argfileio;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_FILEIO;
argfileio = &rpc->all_arg_lists.argfileio;
if (fn != (TEXT *)0) {
strncpy(rpc->all_arg_lists.argfileio.fname, fn, FNLEN);
rpc->all_arg_lists.argfileio.fname[FNALC-1] = '\0';
}
else
rpc->all_arg_lists.argfileio.fname[0] = '\0';
argfileio->lrf = lrf;
argfileio->binf = binf;
argfileio->rndf = rndf;
argfileio->ldf = ldf;
send_request_with_id();
return((NINT) rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_rdfileinf(iofilen, lrf, n_recs)
TEXT **iofilen; /* return pointer to I/O file name */
NINT lrf; /* Learn recall flag */
SL *n_recs; /* return pointer to number of records */
{
RPC_AREA_T *rpc;
ARDFILEINF *ardfileinf;
static TEXT filen[FNALC] = {0};
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_RDFILEINF;
ardfileinf = &rpc->all_arg_lists.ardfileinf;
if (n_recs == (SL *)0)
ardfileinf->n_recs = -1l;
else
ardfileinf->n_recs = 0l;
ardfileinf->lrf = lrf;
#ifdef _MSC_VER
/*
{
FILE *F;
F = fopen("dump.out","w");
fprintf(F,"lrf = %d\n",lrf);
fprintf(F,"ardfileinf->lrf = %ld\n",ardfileinf->lrf);
fprintf(F,"&(ardfileinf->iofilen) = %x\n",ardfileinf->iofilen);
fprintf(F,"&(ardfileinf->lrf) = %x\n",&(ardfileinf->lrf));
fprintf(F,"&(ardfileinf->n_recs) = %x\n",&(ardfileinf->n_recs));
fclose(F);
}
*/
#endif
send_request_with_id();
if (UIO_error_value == 0) {
if (n_recs != (SL *)0)
*n_recs = (SL)ardfileinf->n_recs;
if (ardfileinf->iofilen[0] == '\0')
*iofilen = NULL;
else {
strcpy(filen, (TEXT *)ardfileinf->iofilen);
*iofilen = filen;
}
}
}
/**/
/* FUNCTION */
EXPORT NINT ug_netinit()
{
RPC_AREA_T *rpc;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_NETINIT;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
/* FUNCTION */
EXPORT NINT ug_randseed(seed)
SL seed;
{
RPC_AREA_T *rpc;
rpc = &Data_transfer_ptr->RPC_area;
rpc->request = REQ_UG_RANDSEED;
rpc->all_arg_lists.arandseed.seed = seed;
send_request_with_id();
return((NINT)rpc->return_value.buffer_int);
}
VOID InitGMenu( gmp, chrx, chry ) /* Initialize most menu params */
GMENU *gmp; /* Graphics menu pointer */
int chrx, chry; /* character dimensions */
{
GMENU_ITEM *gmip; /* Graphics menu item pointer */
int wx; /* work index */
int nmi; /* number of menu items */
int tsl; /* total string length */
/* int tpl; */ /* total pixel length */
int x0, y0, x1, y1, ytxt;
int chrxover2; /* x margin */
tsl = 0;
nmi = gmp->num_items;
/* Count total number of characters */
for (gmip = gmp->item, wx = 0; wx < nmi; gmip++, wx++ )
tsl += strlen( gmip->text );
/* tpl = (nmi + tsl) * chrx + 1; */
/* Fill in item structures */
y0 = 1;
y1 = y0 + 2 * GM_MARGIN + chry - 1;
if ( (gmp->flag & GM_AUX) != 0 ) y1 += GM_MARGIN + chry;
ytxt = y1 - GM_MARGIN - chry;
chrxover2 = chrx / 2;
x0 = 1;
for (gmip = gmp->item, wx = 0; wx < nmi ; gmip++ , wx++) {
x1 = x0 + (1+strlen( gmip->text )) * chrx - 1;
gmip->x0 = x0;
gmip->x1 = x1;
gmip->y0 = y0;
gmip->y1 = y1;
/* text always aligned on character size boundary rel to start of menu */
gmip->xt = x0 + chrxover2;
gmip->yt = ytxt;
x0 = x1 + 2;
gmip->flag = 0x0000;
}
gmp->x1 = x1 + 1;
gmp->y1 = y1 + 1;
}
VOID DispGMenu( gmp )
GMENU *gmp; /* Graphics menu pointer */
{
GMENU_ITEM *gmip; /* Graphics menu item pointer */
int nmi; /* number of menu items */
int wx; /* work nint */
/* Display outline */
nmi = gmp->num_items;
for (gmip = gmp->item, wx = 0; wx < nmi; gmip++, wx++ )
ug_line( gmp->key, gm_outcolor, 0,
gmp->x0 + gmip->x0 - 1, gmp->y0,
gmp->x0 + gmip->x0 - 1, gmp->y0 + gmp->y1, 0 );
ug_line( gmp->key, gm_outcolor, 0,
gmp->x0 + gmp->x1, gmp->y0,
gmp->x0 + gmp->x1, gmp->y0 + gmp->y1, 0 );
/* Draw horizontal lines */
ug_line( gmp->key, gm_outcolor, 0,
gmp->x0, gmp->y0,
gmp->x0 + gmp->x1, gmp->y0, 0 );
ug_line( gmp->key, gm_outcolor, 0,
gmp->x0, gmp->y0 + gmp->y1,
gmp->x0 + gmp->x1, gmp->y0 + gmp->y1, 0 );
for (gmip = gmp->item, wx = 0; wx < nmi; gmip++, wx++ ) {
gmip->flag &= ~GM_HILITE; /* Unhighlight */
DispGItem( gmp, gmip, gm_txtcolor, gm_intcolor );
}
}
VOID DispGItem( gmp, gmip, text_color, back_color )
GMENU *gmp; /* Graphics menu pointer */
GMENU_ITEM *gmip; /* Graphics menu item pointer */
int text_color;
int back_color;
{
ug_boxf( gmp->key, back_color, 0,
gmp->x0 + gmip->x0, gmp->y0 + gmip->y0,
gmp->x0 + gmip->x1, gmp->y0 + gmip->y1 );
ug_puts( gmp->key, text_color, 0,
gmp->x0 + gmip->xt, gmp->y0 + gmip->yt, gmip->text, 0 );
if ( (gmp->flag & GM_AUX) != 0 )
ug_puts( gmp->key, text_color, 0,
gmp->x0 + gmip->xt, gmp->y0 + gmip->y0 + GM_MARGIN - 1,
gmip->text2, 0 );
}
GMENU_ITEM *LookGMenu( gmp , button ) /* returns item and button code */
GMENU *gmp; /* Graphics menu pointer */
int *button; /* returned button code */
{
GMENU_ITEM *gmip; /* Graphics menu item pointer */
GMENU_ITEM *rgmip; /* Returned graphics menu item pointer */
int nmi; /* Number of menu items */
int key, xp, yp; /* for mouse call */
int wx; /* work nint */
rgmip = (GMENU_ITEM *) 0;
nmi = gmp->num_items;
ug_mouse( &key, &xp, &yp, button );
xp = xp - gmp->x0;
yp = yp - gmp->y0;
if ( key == gmp->key ) { /* Find item pointed to and highlight */
for (gmip = gmp->item, wx = 0; wx < nmi; gmip++, wx++ ) {
if ( xp >= gmip->x0 && xp <= gmip->x1 &&
yp >= gmip->y0 && yp <= gmip->y1 &&
rgmip == (GMENU_ITEM *)0 &&
(gmip->flag & GM_LOCKED) == 0 )
{
if ( (gmip->flag & GM_HILITE) == 0) {
gmip->flag |= GM_HILITE;
DispGItem( gmp, gmip, gm_intcolor, gm_txtcolor ); /* highlight */
}
rgmip = gmip;
} else if ( (gmip->flag & GM_HILITE) != 0) {
gmip->flag &= ~GM_HILITE;
DispGItem( gmp, gmip, gm_txtcolor, gm_intcolor ); /* Unhighlight */
}
}
} else { /* Unhilight any highlighted items */
for (gmip = gmp->item, wx = 0; wx < nmi; gmip++, wx++ )
if ( (gmip->flag & GM_HILITE) != 0) {
gmip->flag &= ~GM_HILITE;
DispGItem( gmp, gmip, gm_txtcolor, gm_intcolor ); /* Unhighlight */
}
}
return( rgmip );
}